package mybox.engine.fresnel;

import mybox.engine.Figur;
import mybox.engine.File4Qcad;
import mybox.engine.Line;
import mybox.engine.QVector;

import static java.lang.Math.*;


public class ZinkenTp2  implements Figur {
	
File4Qcad file4qcad;
	
	double alpha;
	double gamma;
	double dicke; //des Spiegels
	double breite;
	double sichtbareBreite;
	QVector offset;	
	
	double brennweite;
	double offBrennweite;
	double fussabstand;
	
	Line spiegelAuflage;
	Line spiegelFlaeche;
	Line gegenLager;
	double verdeckungsLaenge;
	double schattenStueckLaenge;
	Line schattenStueck;
	Line absatz;
	Line verdeckung;
	
	public ZinkenTp2(File4Qcad file4qcad,  
					double dicke, 					
					double verdeckungsL, 
					double abschattungsBreite,
					double brennweite,
					QVector offset
					) {
		this.file4qcad=file4qcad;		
		this.dicke=dicke;		
		verdeckungsLaenge=verdeckungsL;		
		this.brennweite=brennweite;
		this.offset=offset;
		alpha=calcAlpha(abschattungsBreite, brennweite, offset);
		
		double offsetxMaSB2=offset.x-abschattungsBreite/2;		
						
		double offBrennweiteKompl=tan((PI/2-2*alpha))*offsetxMaSB2;		
		offBrennweite=brennweite-offBrennweiteKompl;
		
		
		sichtbareBreite=calcSichtbareBreite(offBrennweite, alpha);	
		breite=sichtbareBreite+verdeckungsLaenge;
		
		spiegelFlaeche = new Line(file4qcad, offset, new QVector(offset.x+sichtbareBreite*cos(alpha), offset.y+sichtbareBreite*sin(alpha)));
		
		this.verdeckung = new Line(file4qcad,offset,
				new QVector(offset.x-verdeckungsLaenge*cos(alpha),offset.y-verdeckungsLaenge*sin(alpha)));
		
		gegenLager = new Line(file4qcad,verdeckung.end,
				new QVector(verdeckung.end.x+dicke*sin(alpha),verdeckung.end.y-dicke*cos(alpha)));
		
		spiegelAuflage = new Line(file4qcad,gegenLager.end,
					new QVector(gegenLager.end.x+breite*cos(alpha),gegenLager.end.y+breite*sin(alpha)));
		
		gamma = calcGamm(brennweite, abschattungsBreite, spiegelFlaeche);
		
		double gammaS=PI/2-gamma;
		
		schattenStueckLaenge=dicke*tan(gammaS-alpha);
		
		schattenStueck = new Line(file4qcad,spiegelAuflage.end,
				new QVector(spiegelAuflage.end.x+schattenStueckLaenge*cos(alpha),spiegelAuflage.end.y+schattenStueckLaenge*sin(alpha)));
		
		QVector nextOffset = new QVector(schattenStueck.end.x+schattenStueck.end.y*tan(gammaS),0);
		
		absatz=new Line(file4qcad,
					schattenStueck.end,
					nextOffset					
				);
		
	}

	
	
	public static double calcAlpha(double abschattungsbreite, double brennweite, QVector offset) {		
		QVector aL = new QVector(-abschattungsbreite/2, brennweite);		
		double rho=calcRho(aL, offset);
		//double rhoDeg=rho*180/PI;		
		return (PI/2-rho)/2; //=alpha
	}
	
	public static double calcGamm(double brennweite, double abschattungsBreite, Line spiegelFlaeche) {
		return AngleHelper.absoluteRad(atan2(brennweite-spiegelFlaeche.end.y, spiegelFlaeche.end.x+abschattungsBreite/2));
	}
	
	public static double calcRho(QVector aL, QVector offset) {
		return AngleHelper.absoluteRad(atan2((aL.y-offset.y), (offset.x-aL.x)));
	}
	
	public static double calcSichtbareBreite(double brennweite, double alpha) {
		return sin(2*alpha)*brennweite/cos(alpha);
	}

	@Override
	public void draw() {
		//spiegelFlaeche.draw();	
		verdeckung.draw();
		gegenLager.draw();
		spiegelAuflage.draw();
		schattenStueck.draw();
		absatz.draw();
	}

}
